﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MarkDownFileSplitter.Pdf
{
    internal class UmiOCRUtils
    {
        /// <summary>
        /// 单个图片提取文字的方法
        /// </summary>
        /// <param name="imgFilePath"></param>
        /// <param name="outputTxtFilePath"></param>
        public static void RunUmiOCR(string imgFilePath, string outputTxtFilePath)
        {
            File.Create(outputTxtFilePath).Dispose(); // 创建一个空的txt文件
            // 创建一个新的进程  
            Process process = new Process();
            process.StartInfo.FileName = GlobalSetting.Instance.UmiOCRPath; // 指定要执行的 .exe 文件路径  
            process.StartInfo.Arguments = $"--path {imgFilePath} --output_append {outputTxtFilePath}"; // 传递给 .exe 的命令
            //不能开启重定向输出，否则会导致编码解析错误，原因不明
            //process.StartInfo.RedirectStandardOutput = true; // 重定向输出  
            process.StartInfo.UseShellExecute = false; // 不使用操作系统外壳程序启动  
            process.StartInfo.CreateNoWindow = true; // 不创建窗口  
            process.Start();
            process.WaitForExit();
        }

        /// <summary>
        /// 批量图片提取文字的方法
        /// </summary>
        /// <param name="imgFilePaths"></param>
        /// <param name="outputTxtFilePath"></param>
        public static void RunBatchUmiOCR(List<string> imgFilePaths, string outputTxtFilePath)
        {
            // 创建一个新的进程  
            Process process = new Process();
            process.StartInfo.FileName = GlobalSetting.Instance.UmiOCRPath; // 指定要执行的 .exe 文件路径  
            process.StartInfo.Arguments = $"--path {string.Join(" ", imgFilePaths)} --output {outputTxtFilePath}"; // 传递给 .exe 的命令
            process.StartInfo.UseShellExecute = false; // 不使用操作系统外壳程序启动  
            process.StartInfo.CreateNoWindow = true; // 不创建窗口  
            process.Start();
            process.WaitForExit();
        }

        public static void QuitUmiOCR()
        {
            Process process = new Process();
            process.StartInfo.FileName = GlobalSetting.Instance.UmiOCRPath; // 指定要执行的 .exe 文件路径  
            process.StartInfo.Arguments = "--quit"; // 传递给 .exe 的命令
            process.StartInfo.UseShellExecute = false; // 不使用操作系统外壳程序启动  
            process.StartInfo.CreateNoWindow = true; // 不创建窗口  
            process.Start();
            process.WaitForExit();
        }

        /// <summary>
        /// 尝试直接从pdf提取文字的方法。由于无法得知何时转换完成，所以不能使用。
        /// </summary>
        /// <param name="pdfPath"></param>
        public static void RunUmiOCR_BatchDoc(string pdfPath)
        {
            //正确格式：umi-ocr --call_qml BatchDOC --func addDocs "[\"E:/数据/测试数据/Studio知识库测试/pdf/1.城市设计导则-未压缩.pdf\"]"
            Process process = new Process();
            process.StartInfo.FileName = GlobalSetting.Instance.UmiOCRPath; // 指定要执行的 .exe 文件路径  
            process.StartInfo.Arguments = $"--call_qml BatchDOC --func addDocs \"[\\\"{pdfPath.Replace(@"\", "/")}\\\"]\""; // 传递给 .exe 的命令
            process.StartInfo.UseShellExecute = false; // 不使用操作系统外壳程序启动  
            process.StartInfo.CreateNoWindow = true; // 不创建窗口  
            process.Start();
            process.WaitForExit();

            Process process1 = new Process();
            process1.StartInfo.FileName = GlobalSetting.Instance.UmiOCRPath; // 指定要执行的 .exe 文件路径  
            process1.StartInfo.Arguments = "--call_qml BatchDOC --func docStart --thread";
            process1.StartInfo.UseShellExecute = false; // 不使用操作系统外壳程序启动  
            process1.StartInfo.CreateNoWindow = true; // 不创建窗口  
            process1.StartInfo.RedirectStandardOutput = true; // 重定向输出  

            process1.OutputDataReceived += (sender, e) =>
            {
                if (!string.IsNullOrEmpty(e.Data))
                {
                }
            };

            process1.Start();
            //process1.BeginOutputReadLine();
            process1.WaitForExit();
            string output = process.StandardOutput.ReadToEnd();
        }
    }
}
